package de.dpunkt.myaktion.service;

import java.util.ArrayList;
import java.util.List;
import java.util.logging.Logger;

import javax.ejb.ObjectNotFoundException;
import javax.ejb.Stateless;
import javax.inject.Inject;

import de.dpunkt.myaktion.model.Aktion;
import de.dpunkt.myaktion.model.Spende;
import de.dpunkt.myaktion.util.qualifier.FachLog;
import de.dpunkt.myaktion.util.qualifier.TechLog;

@Stateless
public class SpendeServiceBean implements SpendeService {

	@Inject @FachLog
	private transient Logger fachLog;
	
	@Inject @TechLog
	private transient Logger techLog;

	@Inject
	private AktionService aktionService;
	
	@Inject
	private IdService idService;
	
	@Override
	public List<Spende> getSpendeList(final Long aktionId) throws ObjectNotFoundException {
		final Aktion managedAktion = aktionService.getAktion(aktionId);
		final List<Spende> spenden = managedAktion.getSpenden();
		return spenden;
	}

	@Override
	public void addSpende(final Long aktionId, final Spende spende) throws ObjectNotFoundException {
		final Aktion managedAktion = aktionService.getAktion(aktionId);
		if (spende.getBetrag() < managedAktion.getSpendenBetrag()) {
			fachLog.severe("Mindestspendenbetrag beläuft sich auf " + managedAktion.getSpendenBetrag() + " €.");
		}
		spende.setId(idService.nextId());
		spende.getKonto().setName(spende.getSpenderName());
		managedAktion.addSpende(spende);
		fachLog.info(spende.getSpenderName() + " hat " + spende.getBetrag() + " € gespendet");
	}
	
	@Override
	public void transferSpende() {
	}
	
	@Override
	public List<Spende> getSpendeListPublic(final Long aktionId) throws ObjectNotFoundException {
		final Aktion managedAktion = aktionService.getAktion(aktionId);
		if (null == managedAktion) throw new ObjectNotFoundException();
		final List<Spende> result = new ArrayList<Spende>();
		for (final Spende spende : managedAktion.getSpenden()) {
			final Spende filtered = new Spende();
			filtered.setBetrag(spende.getBetrag());
			filtered.setSpenderName(spende.getSpenderName());
			result.add(filtered);
		}
		return result;
	}
	
	@Override
	public void deleteSpende(final Spende spende) {
		deleteSpende(spende.getId());
	}

	@Override
	public void deleteSpende(final Long spendeId) {
		for (final Aktion aktion : aktionService.getAllAktionen()) {
			final List<Spende> spenden = aktion.getSpenden();
			for (final Spende spende : spenden) {
				if (spendeId.equals(spende.getId())) {
					aktion.removeSpende(spende);
					return;
				}
			}
		}
	}
}
